.data

file:	.asciiz "lena256.bmp"
buffer: .space 3
output: .space 65590    # 256*256+54 octets
prompt:    .asciiz "Entrez le nom du fichier a traiter : "
goodFormat: .asciiz "BM6\n"
msg2:   .asciiz "\n DIFFERENTS"
msg3:   .asciiz "\n IDENTIQUES"
fx: .word 1, 0, -1, 2, 0, -2, 1, 0, -1
fy: .word -1, -2, -1, 0, 0, 0, 1, 2, 1


.text
.globl __start

__start:

jal HeaderStorage

jal HeaderWriting

li  $v0, 4          # appel systeme print string
la  $a0, prompt     # adresse du string a afficher
syscall

li  $v0 8            # appel systeme read string
la  $a0 file         # argument pour read string
li  $a1 50           # lire 50 characteres
move    $t0, $a0
syscall


##### DEBUT DE FONCTION VERIFICATION #####
#Il semblerait qu'il y ait des caractere invisibles...
Verification:
li  $v0, 13         # appel systeme open file
la  $a0, file       # on recharge file
li  $a1, 0          # oouvert a la lecture
li  $a2, 0          # mode ignore
syscall
move $s6, $v0       # sauvegarger le file descriptor

li  $v0, 14         # appel systeme read file
move    $a0, $s6    # file descriptor
la  $a1, buffer     # adresse du buffer d'ecriture
li  $a2, 3          # nombre de caracteres a lire
syscall

la $a0,buffer       # addresse du fichier a verifier
la $a1,goodFormat   # addresse du comparatif
jal strcmp          # saut vers strcmp

beq $v0,$zero,Ok    # verifier le resultat

li $v0,4            # appel systeme print string
la $a0,msg2         # message a afficher si differents
syscall

j Exit

Ok:
li $v0,4            # appel systeme print string
la $a0,msg3         # message a afficher si identiques
syscall

j loop

strcmp:
add $t0,$zero,$zero
add $t1,$zero,$a0
add $t2,$zero,$a1
jr $ra

loop:
lb $t3($t1)         # on charge un byte pour chaque string
lb $t4($t2)
beqz $t3,checkt2    # verification de la fin du fichier
beqz $t4,missmatch
slt $t5,$t3,$t4     # comparer deux bytes
bnez $t5,missmatch
addi $t1,$t1,1      # t1 pointe vers le prochin byte du fichier verifie
addi $t2,$t2,1
j loop

missmatch: 
addi $v0,$zero,1
j endfunction
checkt2:
bnez $t4,missmatch
add $v0,$zero,$zero

endfunction:
j Exit

li  $v0, 16         # appel systeme close file
move    $a0, $s6    # file descriptor a fermer
syscall
#####FIN DE FONCTION VERIFICATION#####

#####DEBUT FONCTION STOCKAGE#####
HeaderStorage:
li  $v0, 9          # appel systeme sbrk (malloc)
la  $a0, 54         # on veut allouer 54 octets
syscall
sw $v0, ($sp)

li  $v0, 13         # appel systeme open file
la  $a0, file       # on recharge file
li  $a1, 0          # ouvert en lecture
li  $a2, 0          # le mode est ignore
syscall
move $s6, $v0       # sauvegarder le file descriptor

li  $v0, 14         # appel systeme read file
move    $a0, $s6    # file descriptor
lw  $a1, ($sp)      # adresse du buffer sur lequel on ecrit
li  $a2, 54         # nombre de caracteres a lire
syscall

li  $v0, 16         # appel systeme close file
move    $a0, $s6    # file descriptor a fermer
syscall

li  $v0, 16         # appel systeme close file
move    $a0, $s5    # file descriptor a fermer
syscall

jr $ra              # retour
#####FIN FONCTION STOCKAGE#####

#####DEBUT FONCTION VALEUR ABSOLUE#####
####valeur de retour stockee dans $a0
AbsoluteValue:
blt $a0 $0 Inversion #si a < 0 alors on inverse
j Sinon

Inversion:
li $t0 -1
mul $a0 $a0 $t0	    # inverser revient à multiplier par -1
Sinon:		           # Sinon on ne fait rien

jr $ra
#####FIN FONCTION VALEUR ABSOLUE#####

#####DEBUT FONCTION THRESHOLDING$#####
# On veut revenir au debut lorsqu'on touche la fin
Threshold:
add $10, $0, $11    # $10 = $11
slt $1, $12, $11     # $11 > $12 ? - $12 est le seuil
beq $0, $1, Thres    # si la valeur ne depasse pas le seuil, on ne fait rien
li  $11, 255
Thres:
jr $ra
#####FIN FONCTION THRESHOLDING#####


#####DEBUT FONCTION TRAITEMENT GX#####
Loop1:                # $1 stocke une valeur de pixel, $2 et $3 le resultat
bge $1, 9, Sortie    # Sortie apres 9 iterations
addi $2, $2, 1      # i++
add $3, $1
j Loop1
Sortie:
jr $ra
#####FIN FONCTION TRAITEMENT GX#####


#####DEBUT ECRITURE HEADER#####
HeaderWriting:
li  $v0, 13         # appel systeme open file
la  $a0, output     # file descriptor
li  $a1, 1          # ouvert en ecriture
li  $a2, 0          # le mode est ignore
syscall
move $s6, $v0       # sauvegarder le file descriptor

li  $v0, 13         # appel systeme open file
lw  $a0, ($sp)      # file descriptor
li  $a1, 0          # ouvert en lecture
li  $a2, 0          # le mode est ignore
syscall
move $s5, $v0

li  $v0, 15         # appel systeme write file
move    $a0, $s5    # file descriptor
la  $a1, $s6        # adresse du buffer dans lequel on ecrit
li  $a2, 54         # nombre de caracteres a lire
syscall

li  $v0, 16         # appel systeme close file
move    $a0, $s6    # file descriptor a fermer
syscall

li  $v0, 16         # appel systeme close file
move    $a0, $s5    # file descriptor a fermer
syscall

jr $ra
#####FIN ECRITURE HEADER#####

#####DEBUT ECRITURE PIXELS#####
WritePixel:
li  $v0, 13         # appel systeme open file
la  $a0, file       # recharger file
li  $a1, 0          # ouvert en lecture
li  $a2, 0          # le mode est ignore
syscall
move $s6, $v0       # sauvegarder le file descriptor

li  $v0, 14         # appel systeme read file
move    $a0, $s6    # file descriptor
la  $a1, buffer     # adresse du buffer sur lequel on ecrit
li  $a2, 3          # nombre de caracteres a lire
syscall
#####FIN ECRITURE PIXELS#####


#####QUITTER PROPREMENT####
Exit:
li  $v0 10          # appel systeme exit
syscall
####FIN DU FICHIER####